home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / doctest.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  42KB  |  1,341 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. __docformat__ = 'reStructuredText en'
  5. __all__ = [
  6.     'register_optionflag',
  7.     'DONT_ACCEPT_TRUE_FOR_1',
  8.     'DONT_ACCEPT_BLANKLINE',
  9.     'NORMALIZE_WHITESPACE',
  10.     'ELLIPSIS',
  11.     'SKIP',
  12.     'IGNORE_EXCEPTION_DETAIL',
  13.     'COMPARISON_FLAGS',
  14.     'REPORT_UDIFF',
  15.     'REPORT_CDIFF',
  16.     'REPORT_NDIFF',
  17.     'REPORT_ONLY_FIRST_FAILURE',
  18.     'REPORTING_FLAGS',
  19.     'Example',
  20.     'DocTest',
  21.     'DocTestParser',
  22.     'DocTestFinder',
  23.     'DocTestRunner',
  24.     'OutputChecker',
  25.     'DocTestFailure',
  26.     'UnexpectedException',
  27.     'DebugRunner',
  28.     'testmod',
  29.     'testfile',
  30.     'run_docstring_examples',
  31.     'Tester',
  32.     'DocTestSuite',
  33.     'DocFileSuite',
  34.     'set_unittest_reportflags',
  35.     'script_from_examples',
  36.     'testsource',
  37.     'debug_src',
  38.     'debug']
  39. import __future__
  40. import sys
  41. import traceback
  42. import inspect
  43. import linecache
  44. import os
  45. import re
  46. import unittest
  47. import difflib
  48. import pdb
  49. import tempfile
  50. import warnings
  51. from StringIO import StringIO
  52. OPTIONFLAGS_BY_NAME = { }
  53.  
  54. def register_optionflag(name):
  55.     return OPTIONFLAGS_BY_NAME.setdefault(name, 1 << len(OPTIONFLAGS_BY_NAME))
  56.  
  57. DONT_ACCEPT_TRUE_FOR_1 = register_optionflag('DONT_ACCEPT_TRUE_FOR_1')
  58. DONT_ACCEPT_BLANKLINE = register_optionflag('DONT_ACCEPT_BLANKLINE')
  59. NORMALIZE_WHITESPACE = register_optionflag('NORMALIZE_WHITESPACE')
  60. ELLIPSIS = register_optionflag('ELLIPSIS')
  61. SKIP = register_optionflag('SKIP')
  62. IGNORE_EXCEPTION_DETAIL = register_optionflag('IGNORE_EXCEPTION_DETAIL')
  63. COMPARISON_FLAGS = DONT_ACCEPT_TRUE_FOR_1 | DONT_ACCEPT_BLANKLINE | NORMALIZE_WHITESPACE | ELLIPSIS | SKIP | IGNORE_EXCEPTION_DETAIL
  64. REPORT_UDIFF = register_optionflag('REPORT_UDIFF')
  65. REPORT_CDIFF = register_optionflag('REPORT_CDIFF')
  66. REPORT_NDIFF = register_optionflag('REPORT_NDIFF')
  67. REPORT_ONLY_FIRST_FAILURE = register_optionflag('REPORT_ONLY_FIRST_FAILURE')
  68. REPORTING_FLAGS = REPORT_UDIFF | REPORT_CDIFF | REPORT_NDIFF | REPORT_ONLY_FIRST_FAILURE
  69. BLANKLINE_MARKER = '<BLANKLINE>'
  70. ELLIPSIS_MARKER = '...'
  71.  
  72. def _extract_future_flags(globs):
  73.     flags = 0
  74.     for fname in __future__.all_feature_names:
  75.         feature = globs.get(fname, None)
  76.         if feature is getattr(__future__, fname):
  77.             flags |= feature.compiler_flag
  78.             continue
  79.     
  80.     return flags
  81.  
  82.  
  83. def _normalize_module(module, depth = 2):
  84.     if inspect.ismodule(module):
  85.         return module
  86.     elif isinstance(module, (str, unicode)):
  87.         return __import__(module, globals(), locals(), [
  88.             '*'])
  89.     elif module is None:
  90.         return sys.modules[sys._getframe(depth).f_globals['__name__']]
  91.     else:
  92.         raise TypeError('Expected a module, string, or None')
  93.  
  94.  
  95. def _load_testfile(filename, package, module_relative):
  96.     if module_relative:
  97.         package = _normalize_module(package, 3)
  98.         filename = _module_relative_path(package, filename)
  99.         if hasattr(package, '__loader__'):
  100.             if hasattr(package.__loader__, 'get_data'):
  101.                 file_contents = package.__loader__.get_data(filename)
  102.                 return (file_contents.replace(os.linesep, '\n'), filename)
  103.             
  104.         
  105.     
  106.     return (open(filename).read(), filename)
  107.  
  108.  
  109. def _indent(s, indent = 4):
  110.     return re.sub('(?m)^(?!$)', indent * ' ', s)
  111.  
  112.  
  113. def _exception_traceback(exc_info):
  114.     excout = StringIO()
  115.     (exc_type, exc_val, exc_tb) = exc_info
  116.     traceback.print_exception(exc_type, exc_val, exc_tb, file = excout)
  117.     return excout.getvalue()
  118.  
  119.  
  120. class _SpoofOut(StringIO):
  121.     
  122.     def getvalue(self):
  123.         result = StringIO.getvalue(self)
  124.         if result and not result.endswith('\n'):
  125.             result += '\n'
  126.         
  127.         if hasattr(self, 'softspace'):
  128.             del self.softspace
  129.         
  130.         return result
  131.  
  132.     
  133.     def truncate(self, size = None):
  134.         StringIO.truncate(self, size)
  135.         if hasattr(self, 'softspace'):
  136.             del self.softspace
  137.         
  138.  
  139.  
  140.  
  141. def _ellipsis_match(want, got):
  142.     if ELLIPSIS_MARKER not in want:
  143.         return want == got
  144.     
  145.     ws = want.split(ELLIPSIS_MARKER)
  146.     startpos = 0
  147.     endpos = len(got)
  148.     w = ws[0]
  149.     if w:
  150.         if got.startswith(w):
  151.             startpos = len(w)
  152.             del ws[0]
  153.         else:
  154.             return False
  155.     
  156.     w = ws[-1]
  157.     if w:
  158.         if got.endswith(w):
  159.             endpos -= len(w)
  160.             del ws[-1]
  161.         else:
  162.             return False
  163.     
  164.     if startpos > endpos:
  165.         return False
  166.     
  167.     for w in ws:
  168.         startpos = got.find(w, startpos, endpos)
  169.         if startpos < 0:
  170.             return False
  171.         
  172.         startpos += len(w)
  173.     
  174.     return True
  175.  
  176.  
  177. def _comment_line(line):
  178.     line = line.rstrip()
  179.     if line:
  180.         return '# ' + line
  181.     else:
  182.         return '#'
  183.  
  184.  
  185. class _OutputRedirectingPdb(pdb.Pdb):
  186.     
  187.     def __init__(self, out):
  188.         self._OutputRedirectingPdb__out = out
  189.         self._OutputRedirectingPdb__debugger_used = False
  190.         pdb.Pdb.__init__(self, stdout = out)
  191.  
  192.     
  193.     def set_trace(self, frame = None):
  194.         self._OutputRedirectingPdb__debugger_used = True
  195.         if frame is None:
  196.             frame = sys._getframe().f_back
  197.         
  198.         pdb.Pdb.set_trace(self, frame)
  199.  
  200.     
  201.     def set_continue(self):
  202.         if self._OutputRedirectingPdb__debugger_used:
  203.             pdb.Pdb.set_continue(self)
  204.         
  205.  
  206.     
  207.     def trace_dispatch(self, *args):
  208.         save_stdout = sys.stdout
  209.         sys.stdout = self._OutputRedirectingPdb__out
  210.         
  211.         try:
  212.             return pdb.Pdb.trace_dispatch(self, *args)
  213.         finally:
  214.             sys.stdout = save_stdout
  215.  
  216.  
  217.  
  218.  
  219. def _module_relative_path(module, path):
  220.     if not inspect.ismodule(module):
  221.         raise TypeError, 'Expected a module: %r' % module
  222.     
  223.     if path.startswith('/'):
  224.         raise ValueError, 'Module-relative files may not have absolute paths'
  225.     
  226.     if hasattr(module, '__file__'):
  227.         basedir = os.path.split(module.__file__)[0]
  228.     elif module.__name__ == '__main__':
  229.         if len(sys.argv) > 0 and sys.argv[0] != '':
  230.             basedir = os.path.split(sys.argv[0])[0]
  231.         else:
  232.             basedir = os.curdir
  233.     else:
  234.         raise ValueError("Can't resolve paths relative to the module " + module + ' (it has no __file__)')
  235.     return os.path.join(basedir, *path.split('/'))
  236.  
  237.  
  238. class Example:
  239.     
  240.     def __init__(self, source, want, exc_msg = None, lineno = 0, indent = 0, options = None):
  241.         if not source.endswith('\n'):
  242.             source += '\n'
  243.         
  244.         if want and not want.endswith('\n'):
  245.             want += '\n'
  246.         
  247.         if exc_msg is not None and not exc_msg.endswith('\n'):
  248.             exc_msg += '\n'
  249.         
  250.         self.source = source
  251.         self.want = want
  252.         self.lineno = lineno
  253.         self.indent = indent
  254.         if options is None:
  255.             options = { }
  256.         
  257.         self.options = options
  258.         self.exc_msg = exc_msg
  259.  
  260.  
  261.  
  262. class DocTest:
  263.     
  264.     def __init__(self, examples, globs, name, filename, lineno, docstring):
  265.         self.examples = examples
  266.         self.docstring = docstring
  267.         self.globs = globs.copy()
  268.         self.name = name
  269.         self.filename = filename
  270.         self.lineno = lineno
  271.  
  272.     
  273.     def __repr__(self):
  274.         if len(self.examples) == 0:
  275.             examples = 'no examples'
  276.         elif len(self.examples) == 1:
  277.             examples = '1 example'
  278.         else:
  279.             examples = '%d examples' % len(self.examples)
  280.         return '<DocTest %s from %s:%s (%s)>' % (self.name, self.filename, self.lineno, examples)
  281.  
  282.     
  283.     def __cmp__(self, other):
  284.         if not isinstance(other, DocTest):
  285.             return -1
  286.         
  287.         return cmp((self.name, self.filename, self.lineno, id(self)), (other.name, other.filename, other.lineno, id(other)))
  288.  
  289.  
  290.  
  291. class DocTestParser:
  292.     _EXAMPLE_RE = re.compile('\n        # Source consists of a PS1 line followed by zero or more PS2 lines.\n        (?P<source>\n            (?:^(?P<indent> [ ]*) >>>    .*)    # PS1 line\n            (?:\\n           [ ]*  \\.\\.\\. .*)*)  # PS2 lines\n        \\n?\n        # Want consists of any non-blank lines that do not start with PS1.\n        (?P<want> (?:(?![ ]*$)    # Not a blank line\n                     (?![ ]*>>>)  # Not a line starting with PS1\n                     .*$\\n?       # But any other line\n                  )*)\n        ', re.MULTILINE | re.VERBOSE)
  293.     _EXCEPTION_RE = re.compile("\n        # Grab the traceback header.  Different versions of Python have\n        # said different things on the first traceback line.\n        ^(?P<hdr> Traceback\\ \\(\n            (?: most\\ recent\\ call\\ last\n            |   innermost\\ last\n            ) \\) :\n        )\n        \\s* $                # toss trailing whitespace on the header.\n        (?P<stack> .*?)      # don't blink: absorb stuff until...\n        ^ (?P<msg> \\w+ .*)   #     a line *starts* with alphanum.\n        ", re.VERBOSE | re.MULTILINE | re.DOTALL)
  294.     _IS_BLANK_OR_COMMENT = re.compile('^[ ]*(#.*)?$').match
  295.     
  296.     def parse(self, string, name = '<string>'):
  297.         string = string.expandtabs()
  298.         min_indent = self._min_indent(string)
  299.         output = []
  300.         (charno, lineno) = (0, 0)
  301.         for m in self._EXAMPLE_RE.finditer(string):
  302.             output.append(string[charno:m.start()])
  303.             lineno += string.count('\n', charno, m.start())
  304.             (source, options, want, exc_msg) = self._parse_example(m, name, lineno)
  305.             if not self._IS_BLANK_OR_COMMENT(source):
  306.                 output.append(Example(source, want, exc_msg, lineno = lineno, indent = min_indent + len(m.group('indent')), options = options))
  307.             
  308.             lineno += string.count('\n', m.start(), m.end())
  309.             charno = m.end()
  310.         
  311.         output.append(string[charno:])
  312.         return output
  313.  
  314.     
  315.     def get_doctest(self, string, globs, name, filename, lineno):
  316.         return DocTest(self.get_examples(string, name), globs, name, filename, lineno, string)
  317.  
  318.     
  319.     def get_examples(self, string, name = '<string>'):
  320.         return _[1]
  321.  
  322.     
  323.     def _parse_example(self, m, name, lineno):
  324.         indent = len(m.group('indent'))
  325.         source_lines = m.group('source').split('\n')
  326.         self._check_prompt_blank(source_lines, indent, name, lineno)
  327.         self._check_prefix(source_lines[1:], ' ' * indent + '.', name, lineno)
  328.         source = []([ sl[indent + 4:] for sl in source_lines ])
  329.         want = m.group('want')
  330.         want_lines = want.split('\n')
  331.         self._check_prefix(want_lines, ' ' * indent, name, lineno + len(source_lines))
  332.         want = []([ wl[indent:] for wl in want_lines ])
  333.         m = self._EXCEPTION_RE.match(want)
  334.         options = self._find_options(source, name, lineno)
  335.         return (source, options, want, exc_msg)
  336.  
  337.     _OPTION_DIRECTIVE_RE = re.compile('#\\s*doctest:\\s*([^\\n\\\'"]*)$', re.MULTILINE)
  338.     
  339.     def _find_options(self, source, name, lineno):
  340.         options = { }
  341.         for m in self._OPTION_DIRECTIVE_RE.finditer(source):
  342.             option_strings = m.group(1).replace(',', ' ').split()
  343.             for option in option_strings:
  344.                 if option[0] not in '+-' or option[1:] not in OPTIONFLAGS_BY_NAME:
  345.                     raise ValueError('line %r of the doctest for %s has an invalid option: %r' % (lineno + 1, name, option))
  346.                 
  347.                 flag = OPTIONFLAGS_BY_NAME[option[1:]]
  348.                 options[flag] = option[0] == '+'
  349.             
  350.         
  351.         if options and self._IS_BLANK_OR_COMMENT(source):
  352.             raise ValueError('line %r of the doctest for %s has an option directive on a line with no example: %r' % (lineno, name, source))
  353.         
  354.         return options
  355.  
  356.     _INDENT_RE = re.compile('^([ ]*)(?=\\S)', re.MULTILINE)
  357.     
  358.     def _min_indent(self, s):
  359.         indents = [ len(indent) for indent in self._INDENT_RE.findall(s) ]
  360.  
  361.     
  362.     def _check_prompt_blank(self, lines, indent, name, lineno):
  363.         for i, line in enumerate(lines):
  364.             if len(line) >= indent + 4 and line[indent + 3] != ' ':
  365.                 raise ValueError('line %r of the docstring for %s lacks blank after %s: %r' % (lineno + i + 1, name, line[indent:indent + 3], line))
  366.                 continue
  367.         
  368.  
  369.     
  370.     def _check_prefix(self, lines, prefix, name, lineno):
  371.         for i, line in enumerate(lines):
  372.             if line and not line.startswith(prefix):
  373.                 raise ValueError('line %r of the docstring for %s has inconsistent leading whitespace: %r' % (lineno + i + 1, name, line))
  374.                 continue
  375.         
  376.  
  377.  
  378.  
  379. class DocTestFinder:
  380.     
  381.     def __init__(self, verbose = False, parser = DocTestParser(), recurse = True, exclude_empty = True):
  382.         self._parser = parser
  383.         self._verbose = verbose
  384.         self._recurse = recurse
  385.         self._exclude_empty = exclude_empty
  386.  
  387.     
  388.     def find(self, obj, name = None, module = None, globs = None, extraglobs = None):
  389.         if name is None:
  390.             name = getattr(obj, '__name__', None)
  391.             if name is None:
  392.                 raise ValueError("DocTestFinder.find: name must be given when obj.__name__ doesn't exist: %r" % (type(obj),))
  393.             
  394.         
  395.         if module is False:
  396.             module = None
  397.         elif module is None:
  398.             module = inspect.getmodule(obj)
  399.         
  400.         
  401.         try:
  402.             if not inspect.getsourcefile(obj):
  403.                 pass
  404.             file = inspect.getfile(obj)
  405.             source_lines = linecache.getlines(file)
  406.             if not source_lines:
  407.                 source_lines = None
  408.         except TypeError:
  409.             source_lines = None
  410.  
  411.         if globs is None:
  412.             if module is None:
  413.                 globs = { }
  414.             else:
  415.                 globs = module.__dict__.copy()
  416.         else:
  417.             globs = globs.copy()
  418.         if extraglobs is not None:
  419.             globs.update(extraglobs)
  420.         
  421.         tests = []
  422.         self._find(tests, obj, name, module, source_lines, globs, { })
  423.         tests.sort()
  424.         return tests
  425.  
  426.     
  427.     def _from_module(self, module, object):
  428.         if module is None:
  429.             return True
  430.         elif inspect.isfunction(object):
  431.             return module.__dict__ is object.func_globals
  432.         elif inspect.isclass(object):
  433.             return module.__name__ == object.__module__
  434.         elif inspect.getmodule(object) is not None:
  435.             return module is inspect.getmodule(object)
  436.         elif hasattr(object, '__module__'):
  437.             return module.__name__ == object.__module__
  438.         elif isinstance(object, property):
  439.             return True
  440.         else:
  441.             raise ValueError('object must be a class or function')
  442.  
  443.     
  444.     def _find(self, tests, obj, name, module, source_lines, globs, seen):
  445.         if self._verbose:
  446.             print 'Finding tests in %s' % name
  447.         
  448.         if id(obj) in seen:
  449.             return None
  450.         
  451.         seen[id(obj)] = 1
  452.         test = self._get_test(obj, name, module, globs, source_lines)
  453.         if test is not None:
  454.             tests.append(test)
  455.         
  456.         if inspect.ismodule(obj) and self._recurse:
  457.             for valname, val in obj.__dict__.items():
  458.                 valname = '%s.%s' % (name, valname)
  459.                 if (inspect.isfunction(val) or inspect.isclass(val)) and self._from_module(module, val):
  460.                     self._find(tests, val, valname, module, source_lines, globs, seen)
  461.                     continue
  462.             
  463.         
  464.         if inspect.ismodule(obj) and self._recurse:
  465.             for valname, val in getattr(obj, '__test__', { }).items():
  466.                 if not isinstance(valname, basestring):
  467.                     raise ValueError('DocTestFinder.find: __test__ keys must be strings: %r' % (type(valname),))
  468.                 
  469.                 if not inspect.isfunction(val) and inspect.isclass(val) and inspect.ismethod(val) and inspect.ismodule(val) or isinstance(val, basestring):
  470.                     raise ValueError('DocTestFinder.find: __test__ values must be strings, functions, methods, classes, or modules: %r' % (type(val),))
  471.                 
  472.                 valname = '%s.__test__.%s' % (name, valname)
  473.                 self._find(tests, val, valname, module, source_lines, globs, seen)
  474.             
  475.         
  476.         if inspect.isclass(obj) and self._recurse:
  477.             for valname, val in obj.__dict__.items():
  478.                 if isinstance(val, staticmethod):
  479.                     val = getattr(obj, valname)
  480.                 
  481.                 if isinstance(val, classmethod):
  482.                     val = getattr(obj, valname).im_func
  483.                 
  484.                 if (inspect.isfunction(val) and inspect.isclass(val) or isinstance(val, property)) and self._from_module(module, val):
  485.                     valname = '%s.%s' % (name, valname)
  486.                     self._find(tests, val, valname, module, source_lines, globs, seen)
  487.                     continue
  488.             
  489.         
  490.  
  491.     
  492.     def _get_test(self, obj, name, module, globs, source_lines):
  493.         if isinstance(obj, basestring):
  494.             docstring = obj
  495.         else:
  496.             
  497.             try:
  498.                 if obj.__doc__ is None:
  499.                     docstring = ''
  500.                 else:
  501.                     docstring = obj.__doc__
  502.                     if not isinstance(docstring, basestring):
  503.                         docstring = str(docstring)
  504.             except (TypeError, AttributeError):
  505.                 docstring = ''
  506.             
  507.  
  508.         lineno = self._find_lineno(obj, source_lines)
  509.         if self._exclude_empty and not docstring:
  510.             return None
  511.         
  512.         if module is None:
  513.             filename = None
  514.         else:
  515.             filename = getattr(module, '__file__', module.__name__)
  516.             if filename[-4:] in ('.pyc', '.pyo'):
  517.                 filename = filename[:-1]
  518.             
  519.         return self._parser.get_doctest(docstring, globs, name, filename, lineno)
  520.  
  521.     
  522.     def _find_lineno(self, obj, source_lines):
  523.         lineno = None
  524.         if inspect.ismodule(obj):
  525.             lineno = 0
  526.         
  527.         if inspect.isclass(obj):
  528.             if source_lines is None:
  529.                 return None
  530.             
  531.             pat = re.compile('^\\s*class\\s*%s\\b' % getattr(obj, '__name__', '-'))
  532.             for i, line in enumerate(source_lines):
  533.                 if pat.match(line):
  534.                     lineno = i
  535.                     break
  536.                     continue
  537.             
  538.         
  539.         if inspect.ismethod(obj):
  540.             obj = obj.im_func
  541.         
  542.         if inspect.isfunction(obj):
  543.             obj = obj.func_code
  544.         
  545.         if inspect.istraceback(obj):
  546.             obj = obj.tb_frame
  547.         
  548.         if inspect.isframe(obj):
  549.             obj = obj.f_code
  550.         
  551.         if inspect.iscode(obj):
  552.             lineno = getattr(obj, 'co_firstlineno', None) - 1
  553.         
  554.         if lineno is not None:
  555.             if source_lines is None:
  556.                 return lineno + 1
  557.             
  558.             pat = re.compile('(^|.*:)\\s*\\w*("|\')')
  559.             for lineno in range(lineno, len(source_lines)):
  560.                 if pat.match(source_lines[lineno]):
  561.                     return lineno
  562.                     continue
  563.             
  564.         
  565.  
  566.  
  567.  
  568. class DocTestRunner:
  569.     DIVIDER = '*' * 70
  570.     
  571.     def __init__(self, checker = None, verbose = None, optionflags = 0):
  572.         if not checker:
  573.             pass
  574.         self._checker = OutputChecker()
  575.         if verbose is None:
  576.             verbose = '-v' in sys.argv
  577.         
  578.         self._verbose = verbose
  579.         self.optionflags = optionflags
  580.         self.original_optionflags = optionflags
  581.         self.tries = 0
  582.         self.failures = 0
  583.         self._name2ft = { }
  584.         self._fakeout = _SpoofOut()
  585.  
  586.     
  587.     def report_start(self, out, test, example):
  588.         if self._verbose:
  589.             if example.want:
  590.                 out('Trying:\n' + _indent(example.source) + 'Expecting:\n' + _indent(example.want))
  591.             else:
  592.                 out('Trying:\n' + _indent(example.source) + 'Expecting nothing\n')
  593.         
  594.  
  595.     
  596.     def report_success(self, out, test, example, got):
  597.         if self._verbose:
  598.             out('ok\n')
  599.         
  600.  
  601.     
  602.     def report_failure(self, out, test, example, got):
  603.         out(self._failure_header(test, example) + self._checker.output_difference(example, got, self.optionflags))
  604.  
  605.     
  606.     def report_unexpected_exception(self, out, test, example, exc_info):
  607.         out(self._failure_header(test, example) + 'Exception raised:\n' + _indent(_exception_traceback(exc_info)))
  608.  
  609.     
  610.     def _failure_header(self, test, example):
  611.         out = [
  612.             self.DIVIDER]
  613.         if test.filename:
  614.             if test.lineno is not None and example.lineno is not None:
  615.                 lineno = test.lineno + example.lineno + 1
  616.             else:
  617.                 lineno = '?'
  618.             out.append('File "%s", line %s, in %s' % (test.filename, lineno, test.name))
  619.         else:
  620.             out.append('Line %s, in %s' % (example.lineno + 1, test.name))
  621.         out.append('Failed example:')
  622.         source = example.source
  623.         out.append(_indent(source))
  624.         return '\n'.join(out)
  625.  
  626.     
  627.     def __run(self, test, compileflags, out):
  628.         failures = tries = 0
  629.         original_optionflags = self.optionflags
  630.         (SUCCESS, FAILURE, BOOM) = range(3)
  631.         check = self._checker.check_output
  632.         for examplenum, example in enumerate(test.examples):
  633.             if self.optionflags & REPORT_ONLY_FIRST_FAILURE:
  634.                 pass
  635.             quiet = failures > 0
  636.             self.optionflags = original_optionflags
  637.             if example.options:
  638.                 for optionflag, val in example.options.items():
  639.                     if val:
  640.                         self.optionflags |= optionflag
  641.                         continue
  642.                     self
  643.                     self.optionflags &= ~optionflag
  644.                 
  645.             
  646.             if self.optionflags & SKIP:
  647.                 continue
  648.             
  649.             tries += 1
  650.             if not quiet:
  651.                 self.report_start(out, test, example)
  652.             
  653.             filename = '<doctest %s[%d]>' % (test.name, examplenum)
  654.             
  655.             try:
  656.                 exec compile(example.source, filename, 'single', compileflags, 1) in test.globs
  657.                 self.debugger.set_continue()
  658.                 exception = None
  659.             except KeyboardInterrupt:
  660.                 raise 
  661.             except:
  662.                 exception = sys.exc_info()
  663.                 self.debugger.set_continue()
  664.  
  665.             got = self._fakeout.getvalue()
  666.             self._fakeout.truncate(0)
  667.             outcome = FAILURE
  668.             if exception is None:
  669.                 if check(example.want, got, self.optionflags):
  670.                     outcome = SUCCESS
  671.                 
  672.             else:
  673.                 exc_info = sys.exc_info()
  674.                 exc_msg = traceback.format_exception_only(*exc_info[:2])[-1]
  675.                 if not quiet:
  676.                     got += _exception_traceback(exc_info)
  677.                 
  678.                 if example.exc_msg is None:
  679.                     outcome = BOOM
  680.                 elif check(example.exc_msg, exc_msg, self.optionflags):
  681.                     outcome = SUCCESS
  682.                 elif self.optionflags & IGNORE_EXCEPTION_DETAIL:
  683.                     m1 = re.match('[^:]*:', example.exc_msg)
  684.                     m2 = re.match('[^:]*:', exc_msg)
  685.                     if m1 and m2 and check(m1.group(0), m2.group(0), self.optionflags):
  686.                         outcome = SUCCESS
  687.                     
  688.                 
  689.             if outcome is SUCCESS:
  690.                 if not quiet:
  691.                     self.report_success(out, test, example, got)
  692.                 
  693.             quiet
  694.             if outcome is FAILURE:
  695.                 if not quiet:
  696.                     self.report_failure(out, test, example, got)
  697.                 
  698.                 failures += 1
  699.                 continue
  700.             if outcome is BOOM:
  701.                 if not quiet:
  702.                     self.report_unexpected_exception(out, test, example, exc_info)
  703.                 
  704.                 failures += 1
  705.                 continue
  706.         
  707.         self.optionflags = original_optionflags
  708.         self._DocTestRunner__record_outcome(test, failures, tries)
  709.         return (failures, tries)
  710.  
  711.     
  712.     def __record_outcome(self, test, f, t):
  713.         (f2, t2) = self._name2ft.get(test.name, (0, 0))
  714.         self._name2ft[test.name] = (f + f2, t + t2)
  715.         self.failures += f
  716.         self.tries += t
  717.  
  718.     __LINECACHE_FILENAME_RE = re.compile('<doctest (?P<name>[\\w\\.]+)\\[(?P<examplenum>\\d+)\\]>$')
  719.     
  720.     def __patched_linecache_getlines(self, filename, module_globals = None):
  721.         m = self._DocTestRunner__LINECACHE_FILENAME_RE.match(filename)
  722.         if m and m.group('name') == self.test.name:
  723.             example = self.test.examples[int(m.group('examplenum'))]
  724.             return example.source.splitlines(True)
  725.         else:
  726.             return self.save_linecache_getlines(filename, module_globals)
  727.  
  728.     
  729.     def run(self, test, compileflags = None, out = None, clear_globs = True):
  730.         self.test = test
  731.         if compileflags is None:
  732.             compileflags = _extract_future_flags(test.globs)
  733.         
  734.         save_stdout = sys.stdout
  735.         if out is None:
  736.             out = save_stdout.write
  737.         
  738.         sys.stdout = self._fakeout
  739.         save_set_trace = pdb.set_trace
  740.         self.debugger = _OutputRedirectingPdb(save_stdout)
  741.         self.debugger.reset()
  742.         pdb.set_trace = self.debugger.set_trace
  743.         self.save_linecache_getlines = linecache.getlines
  744.         linecache.getlines = self._DocTestRunner__patched_linecache_getlines
  745.         
  746.         try:
  747.             return self._DocTestRunner__run(test, compileflags, out)
  748.         finally:
  749.             sys.stdout = save_stdout
  750.             pdb.set_trace = save_set_trace
  751.             linecache.getlines = self.save_linecache_getlines
  752.             if clear_globs:
  753.                 test.globs.clear()
  754.             
  755.  
  756.  
  757.     
  758.     def summarize(self, verbose = None):
  759.         if verbose is None:
  760.             verbose = self._verbose
  761.         
  762.         notests = []
  763.         passed = []
  764.         failed = []
  765.         totalt = totalf = 0
  766.         for x in self._name2ft.items():
  767.             (f, t) = (name,)
  768.             totalt += t
  769.             totalf += f
  770.             if t == 0:
  771.                 notests.append(name)
  772.                 continue
  773.             x
  774.             if f == 0:
  775.                 passed.append((name, t))
  776.                 continue
  777.             failed.append(x)
  778.         
  779.         if verbose:
  780.             if notests:
  781.                 print len(notests), 'items had no tests:'
  782.                 notests.sort()
  783.                 for thing in notests:
  784.                     print '   ', thing
  785.                 
  786.             
  787.             if passed:
  788.                 print len(passed), 'items passed all tests:'
  789.                 passed.sort()
  790.                 for thing, count in passed:
  791.                     print ' %3d tests in %s' % (count, thing)
  792.                 
  793.             
  794.         
  795.         if failed:
  796.             print self.DIVIDER
  797.             print len(failed), 'items had failures:'
  798.             failed.sort()
  799.             for f, t in failed:
  800.                 print ' %3d of %3d in %s' % (f, t, thing)
  801.             
  802.         
  803.         if verbose:
  804.             print totalt, 'tests in', len(self._name2ft), 'items.'
  805.             print totalt - totalf, 'passed and', totalf, 'failed.'
  806.         
  807.         if totalf:
  808.             print '***Test Failed***', totalf, 'failures.'
  809.         elif verbose:
  810.             print 'Test passed.'
  811.         
  812.         return (totalf, totalt)
  813.  
  814.     
  815.     def merge(self, other):
  816.         d = self._name2ft
  817.         for f, t in other._name2ft.items():
  818.             d[name] = (f, t)
  819.         
  820.  
  821.  
  822.  
  823. class OutputChecker:
  824.     
  825.     def check_output(self, want, got, optionflags):
  826.         if got == want:
  827.             return True
  828.         
  829.         if not optionflags & DONT_ACCEPT_TRUE_FOR_1:
  830.             if (got, want) == ('True\n', '1\n'):
  831.                 return True
  832.             
  833.             if (got, want) == ('False\n', '0\n'):
  834.                 return True
  835.             
  836.         
  837.         if not optionflags & DONT_ACCEPT_BLANKLINE:
  838.             want = re.sub('(?m)^%s\\s*?$' % re.escape(BLANKLINE_MARKER), '', want)
  839.             got = re.sub('(?m)^\\s*?$', '', got)
  840.             if got == want:
  841.                 return True
  842.             
  843.         
  844.         if optionflags & NORMALIZE_WHITESPACE:
  845.             got = ' '.join(got.split())
  846.             want = ' '.join(want.split())
  847.             if got == want:
  848.                 return True
  849.             
  850.         
  851.         if optionflags & ELLIPSIS:
  852.             if _ellipsis_match(want, got):
  853.                 return True
  854.             
  855.         
  856.         return False
  857.  
  858.     
  859.     def _do_a_fancy_diff(self, want, got, optionflags):
  860.         if not optionflags & (REPORT_UDIFF | REPORT_CDIFF | REPORT_NDIFF):
  861.             return False
  862.         
  863.         if optionflags & REPORT_NDIFF:
  864.             return True
  865.         
  866.         if want.count('\n') > 2:
  867.             pass
  868.         return got.count('\n') > 2
  869.  
  870.     
  871.     def output_difference(self, example, got, optionflags):
  872.         want = example.want
  873.         if not optionflags & DONT_ACCEPT_BLANKLINE:
  874.             got = re.sub('(?m)^[ ]*(?=\n)', BLANKLINE_MARKER, got)
  875.         
  876.         if want and got:
  877.             return 'Expected:\n%sGot:\n%s' % (_indent(want), _indent(got))
  878.         elif want:
  879.             return 'Expected:\n%sGot nothing\n' % _indent(want)
  880.         elif got:
  881.             return 'Expected nothing\nGot:\n%s' % _indent(got)
  882.         else:
  883.             return 'Expected nothing\nGot nothing\n'
  884.  
  885.  
  886.  
  887. class DocTestFailure(Exception):
  888.     
  889.     def __init__(self, test, example, got):
  890.         self.test = test
  891.         self.example = example
  892.         self.got = got
  893.  
  894.     
  895.     def __str__(self):
  896.         return str(self.test)
  897.  
  898.  
  899.  
  900. class UnexpectedException(Exception):
  901.     
  902.     def __init__(self, test, example, exc_info):
  903.         self.test = test
  904.         self.example = example
  905.         self.exc_info = exc_info
  906.  
  907.     
  908.     def __str__(self):
  909.         return str(self.test)
  910.  
  911.  
  912.  
  913. class DebugRunner(DocTestRunner):
  914.     
  915.     def run(self, test, compileflags = None, out = None, clear_globs = True):
  916.         r = DocTestRunner.run(self, test, compileflags, out, False)
  917.         if clear_globs:
  918.             test.globs.clear()
  919.         
  920.         return r
  921.  
  922.     
  923.     def report_unexpected_exception(self, out, test, example, exc_info):
  924.         raise UnexpectedException(test, example, exc_info)
  925.  
  926.     
  927.     def report_failure(self, out, test, example, got):
  928.         raise DocTestFailure(test, example, got)
  929.  
  930.  
  931. master = None
  932.  
  933. def testmod(m = None, name = None, globs = None, verbose = None, report = True, optionflags = 0, extraglobs = None, raise_on_error = False, exclude_empty = False):
  934.     global master
  935.     if m is None:
  936.         m = sys.modules.get('__main__')
  937.     
  938.     if not inspect.ismodule(m):
  939.         raise TypeError('testmod: module required; %r' % (m,))
  940.     
  941.     if name is None:
  942.         name = m.__name__
  943.     
  944.     finder = DocTestFinder(exclude_empty = exclude_empty)
  945.     if raise_on_error:
  946.         runner = DebugRunner(verbose = verbose, optionflags = optionflags)
  947.     else:
  948.         runner = DocTestRunner(verbose = verbose, optionflags = optionflags)
  949.     for test in finder.find(m, name, globs = globs, extraglobs = extraglobs):
  950.         runner.run(test)
  951.     
  952.     if report:
  953.         runner.summarize()
  954.     
  955.     if master is None:
  956.         master = runner
  957.     else:
  958.         master.merge(runner)
  959.     return (runner.failures, runner.tries)
  960.  
  961.  
  962. def testfile(filename, module_relative = True, name = None, package = None, globs = None, verbose = None, report = True, optionflags = 0, extraglobs = None, raise_on_error = False, parser = DocTestParser(), encoding = None):
  963.     global master
  964.     if package and not module_relative:
  965.         raise ValueError('Package may only be specified for module-relative paths.')
  966.     
  967.     (text, filename) = _load_testfile(filename, package, module_relative)
  968.     if name is None:
  969.         name = os.path.basename(filename)
  970.     
  971.     if globs is None:
  972.         globs = { }
  973.     else:
  974.         globs = globs.copy()
  975.     if extraglobs is not None:
  976.         globs.update(extraglobs)
  977.     
  978.     if raise_on_error:
  979.         runner = DebugRunner(verbose = verbose, optionflags = optionflags)
  980.     else:
  981.         runner = DocTestRunner(verbose = verbose, optionflags = optionflags)
  982.     if encoding is not None:
  983.         text = text.decode(encoding)
  984.     
  985.     test = parser.get_doctest(text, globs, name, filename, 0)
  986.     runner.run(test)
  987.     if report:
  988.         runner.summarize()
  989.     
  990.     if master is None:
  991.         master = runner
  992.     else:
  993.         master.merge(runner)
  994.     return (runner.failures, runner.tries)
  995.  
  996.  
  997. def run_docstring_examples(f, globs, verbose = False, name = 'NoName', compileflags = None, optionflags = 0):
  998.     finder = DocTestFinder(verbose = verbose, recurse = False)
  999.     runner = DocTestRunner(verbose = verbose, optionflags = optionflags)
  1000.     for test in finder.find(f, name, globs = globs):
  1001.         runner.run(test, compileflags = compileflags)
  1002.     
  1003.  
  1004.  
  1005. class Tester:
  1006.     
  1007.     def __init__(self, mod = None, globs = None, verbose = None, optionflags = 0):
  1008.         warnings.warn('class Tester is deprecated; use class doctest.DocTestRunner instead', DeprecationWarning, stacklevel = 2)
  1009.         if mod is None and globs is None:
  1010.             raise TypeError('Tester.__init__: must specify mod or globs')
  1011.         
  1012.         if mod is not None and not inspect.ismodule(mod):
  1013.             raise TypeError('Tester.__init__: mod must be a module; %r' % (mod,))
  1014.         
  1015.         if globs is None:
  1016.             globs = mod.__dict__
  1017.         
  1018.         self.globs = globs
  1019.         self.verbose = verbose
  1020.         self.optionflags = optionflags
  1021.         self.testfinder = DocTestFinder()
  1022.         self.testrunner = DocTestRunner(verbose = verbose, optionflags = optionflags)
  1023.  
  1024.     
  1025.     def runstring(self, s, name):
  1026.         test = DocTestParser().get_doctest(s, self.globs, name, None, None)
  1027.         if self.verbose:
  1028.             print 'Running string', name
  1029.         
  1030.         (f, t) = self.testrunner.run(test)
  1031.         if self.verbose:
  1032.             print f, 'of', t, 'examples failed in string', name
  1033.         
  1034.         return (f, t)
  1035.  
  1036.     
  1037.     def rundoc(self, object, name = None, module = None):
  1038.         f = t = 0
  1039.         tests = self.testfinder.find(object, name, module = module, globs = self.globs)
  1040.         for test in tests:
  1041.             (f2, t2) = self.testrunner.run(test)
  1042.             f = f + f2
  1043.             t = t + t2
  1044.         
  1045.         return (f, t)
  1046.  
  1047.     
  1048.     def rundict(self, d, name, module = None):
  1049.         import new as new
  1050.         m = new.module(name)
  1051.         m.__dict__.update(d)
  1052.         if module is None:
  1053.             module = False
  1054.         
  1055.         return self.rundoc(m, name, module)
  1056.  
  1057.     
  1058.     def run__test__(self, d, name):
  1059.         import new
  1060.         m = new.module(name)
  1061.         m.__test__ = d
  1062.         return self.rundoc(m, name)
  1063.  
  1064.     
  1065.     def summarize(self, verbose = None):
  1066.         return self.testrunner.summarize(verbose)
  1067.  
  1068.     
  1069.     def merge(self, other):
  1070.         self.testrunner.merge(other.testrunner)
  1071.  
  1072.  
  1073. _unittest_reportflags = 0
  1074.  
  1075. def set_unittest_reportflags(flags):
  1076.     global _unittest_reportflags
  1077.     if flags & REPORTING_FLAGS != flags:
  1078.         raise ValueError('Only reporting flags allowed', flags)
  1079.     
  1080.     old = _unittest_reportflags
  1081.     _unittest_reportflags = flags
  1082.     return old
  1083.  
  1084.  
  1085. class DocTestCase(unittest.TestCase):
  1086.     
  1087.     def __init__(self, test, optionflags = 0, setUp = None, tearDown = None, checker = None):
  1088.         unittest.TestCase.__init__(self)
  1089.         self._dt_optionflags = optionflags
  1090.         self._dt_checker = checker
  1091.         self._dt_test = test
  1092.         self._dt_setUp = setUp
  1093.         self._dt_tearDown = tearDown
  1094.  
  1095.     
  1096.     def setUp(self):
  1097.         test = self._dt_test
  1098.         if self._dt_setUp is not None:
  1099.             self._dt_setUp(test)
  1100.         
  1101.  
  1102.     
  1103.     def tearDown(self):
  1104.         test = self._dt_test
  1105.         if self._dt_tearDown is not None:
  1106.             self._dt_tearDown(test)
  1107.         
  1108.         test.globs.clear()
  1109.  
  1110.     
  1111.     def runTest(self):
  1112.         test = self._dt_test
  1113.         old = sys.stdout
  1114.         new = StringIO()
  1115.         optionflags = self._dt_optionflags
  1116.         if not optionflags & REPORTING_FLAGS:
  1117.             optionflags |= _unittest_reportflags
  1118.         
  1119.         runner = DocTestRunner(optionflags = optionflags, checker = self._dt_checker, verbose = False)
  1120.         
  1121.         try:
  1122.             runner.DIVIDER = '-' * 70
  1123.             (failures, tries) = runner.run(test, out = new.write, clear_globs = False)
  1124.         finally:
  1125.             sys.stdout = old
  1126.  
  1127.         if failures:
  1128.             raise self.failureException(self.format_failure(new.getvalue()))
  1129.         
  1130.  
  1131.     
  1132.     def format_failure(self, err):
  1133.         test = self._dt_test
  1134.         if test.lineno is None:
  1135.             lineno = 'unknown line number'
  1136.         else:
  1137.             lineno = '%s' % test.lineno
  1138.         lname = '.'.join(test.name.split('.')[-1:])
  1139.         return 'Failed doctest test for %s\n  File "%s", line %s, in %s\n\n%s' % (test.name, test.filename, lineno, lname, err)
  1140.  
  1141.     
  1142.     def debug(self):
  1143.         self.setUp()
  1144.         runner = DebugRunner(optionflags = self._dt_optionflags, checker = self._dt_checker, verbose = False)
  1145.         runner.run(self._dt_test)
  1146.         self.tearDown()
  1147.  
  1148.     
  1149.     def id(self):
  1150.         return self._dt_test.name
  1151.  
  1152.     
  1153.     def __repr__(self):
  1154.         name = self._dt_test.name.split('.')
  1155.         return '%s (%s)' % (name[-1], '.'.join(name[:-1]))
  1156.  
  1157.     __str__ = __repr__
  1158.     
  1159.     def shortDescription(self):
  1160.         return 'Doctest: ' + self._dt_test.name
  1161.  
  1162.  
  1163.  
  1164. def DocTestSuite(module = None, globs = None, extraglobs = None, test_finder = None, **options):
  1165.     if test_finder is None:
  1166.         test_finder = DocTestFinder()
  1167.     
  1168.     module = _normalize_module(module)
  1169.     tests = test_finder.find(module, globs = globs, extraglobs = extraglobs)
  1170.     if globs is None:
  1171.         globs = module.__dict__
  1172.     
  1173.     if not tests:
  1174.         raise ValueError(module, 'has no tests')
  1175.     
  1176.     tests.sort()
  1177.     suite = unittest.TestSuite()
  1178.     for test in tests:
  1179.         if len(test.examples) == 0:
  1180.             continue
  1181.         
  1182.         if not test.filename:
  1183.             filename = module.__file__
  1184.             if filename[-4:] in ('.pyc', '.pyo'):
  1185.                 filename = filename[:-1]
  1186.             
  1187.             test.filename = filename
  1188.         
  1189.         suite.addTest(DocTestCase(test, **options))
  1190.     
  1191.     return suite
  1192.  
  1193.  
  1194. class DocFileCase(DocTestCase):
  1195.     
  1196.     def id(self):
  1197.         return '_'.join(self._dt_test.name.split('.'))
  1198.  
  1199.     
  1200.     def __repr__(self):
  1201.         return self._dt_test.filename
  1202.  
  1203.     __str__ = __repr__
  1204.     
  1205.     def format_failure(self, err):
  1206.         return 'Failed doctest test for %s\n  File "%s", line 0\n\n%s' % (self._dt_test.name, self._dt_test.filename, err)
  1207.  
  1208.  
  1209.  
  1210. def DocFileTest(path, module_relative = True, package = None, globs = None, parser = DocTestParser(), encoding = None, **options):
  1211.     if globs is None:
  1212.         globs = { }
  1213.     else:
  1214.         globs = globs.copy()
  1215.     if package and not module_relative:
  1216.         raise ValueError('Package may only be specified for module-relative paths.')
  1217.     
  1218.     (doc, path) = _load_testfile(path, package, module_relative)
  1219.     if '__file__' not in globs:
  1220.         globs['__file__'] = path
  1221.     
  1222.     name = os.path.basename(path)
  1223.     if encoding is not None:
  1224.         doc = doc.decode(encoding)
  1225.     
  1226.     test = parser.get_doctest(doc, globs, name, path, 0)
  1227.     return DocFileCase(test, **options)
  1228.  
  1229.  
  1230. def DocFileSuite(*paths, **kw):
  1231.     suite = unittest.TestSuite()
  1232.     if kw.get('module_relative', True):
  1233.         kw['package'] = _normalize_module(kw.get('package'))
  1234.     
  1235.     for path in paths:
  1236.         suite.addTest(DocFileTest(path, **kw))
  1237.     
  1238.     return suite
  1239.  
  1240.  
  1241. def script_from_examples(s):
  1242.     output = []
  1243.     for piece in DocTestParser().parse(s):
  1244.         if isinstance(piece, Example):
  1245.             output.append(piece.source[:-1])
  1246.             want = piece.want
  1247.             if want:
  1248.                 output.append('# Expected:')
  1249.                 [] += [ '## ' + l for l in want.split('\n')[:-1] ]
  1250.             
  1251.         want
  1252.         [] += [ _comment_line(l) for l in piece.split('\n')[:-1] ]
  1253.     
  1254.     while output and output[-1] == '#':
  1255.         output.pop()
  1256.         continue
  1257.         []
  1258.     while output and output[0] == '#':
  1259.         output.pop(0)
  1260.         continue
  1261.         output
  1262.     return '\n'.join(output) + '\n'
  1263.  
  1264.  
  1265. def testsource(module, name):
  1266.     module = _normalize_module(module)
  1267.     tests = DocTestFinder().find(module)
  1268.     test = _[1]
  1269.     test = test[0]
  1270.     testsrc = script_from_examples(test.docstring)
  1271.     return testsrc
  1272.  
  1273.  
  1274. def debug_src(src, pm = False, globs = None):
  1275.     testsrc = script_from_examples(src)
  1276.     debug_script(testsrc, pm, globs)
  1277.  
  1278.  
  1279. def debug_script(src, pm = False, globs = None):
  1280.     import pdb
  1281.     srcfilename = tempfile.mktemp('.py', 'doctestdebug')
  1282.     f = open(srcfilename, 'w')
  1283.     f.write(src)
  1284.     f.close()
  1285.     
  1286.     try:
  1287.         if globs:
  1288.             globs = globs.copy()
  1289.         else:
  1290.             globs = { }
  1291.         if pm:
  1292.             
  1293.             try:
  1294.                 execfile(srcfilename, globs, globs)
  1295.             print sys.exc_info()[1]
  1296.             pdb.post_mortem(sys.exc_info()[2])
  1297.  
  1298.         else:
  1299.             pdb.run('execfile(%r)' % srcfilename, globs, globs)
  1300.     finally:
  1301.         os.remove(srcfilename)
  1302.  
  1303.  
  1304.  
  1305. def debug(module, name, pm = False):
  1306.     module = _normalize_module(module)
  1307.     testsrc = testsource(module, name)
  1308.     debug_script(testsrc, pm, module.__dict__)
  1309.  
  1310.  
  1311. class _TestClass:
  1312.     
  1313.     def __init__(self, val):
  1314.         self.val = val
  1315.  
  1316.     
  1317.     def square(self):
  1318.         self.val = self.val ** 2
  1319.         return self
  1320.  
  1321.     
  1322.     def get(self):
  1323.         return self.val
  1324.  
  1325.  
  1326. __test__ = {
  1327.     '_TestClass': _TestClass,
  1328.     'string': '\n                      Example of a string object, searched as-is.\n                      >>> x = 1; y = 2\n                      >>> x + y, x * y\n                      (3, 2)\n                      ',
  1329.     'bool-int equivalence': '\n                                    In 2.2, boolean expressions displayed\n                                    0 or 1.  By default, we still accept\n                                    them.  This can be disabled by passing\n                                    DONT_ACCEPT_TRUE_FOR_1 to the new\n                                    optionflags argument.\n                                    >>> 4 == 4\n                                    1\n                                    >>> 4 == 4\n                                    True\n                                    >>> 4 > 4\n                                    0\n                                    >>> 4 > 4\n                                    False\n                                    ',
  1330.     'blank lines': "\n                Blank lines can be marked with <BLANKLINE>:\n                    >>> print 'foo\\n\\nbar\\n'\n                    foo\n                    <BLANKLINE>\n                    bar\n                    <BLANKLINE>\n            ",
  1331.     'ellipsis': "\n                If the ellipsis flag is used, then '...' can be used to\n                elide substrings in the desired output:\n                    >>> print range(1000) #doctest: +ELLIPSIS\n                    [0, 1, 2, ..., 999]\n            ",
  1332.     'whitespace normalization': '\n                If the whitespace normalization flag is used, then\n                differences in whitespace are ignored.\n                    >>> print range(30) #doctest: +NORMALIZE_WHITESPACE\n                    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\n                     15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,\n                     27, 28, 29]\n            ' }
  1333.  
  1334. def _test():
  1335.     r = unittest.TextTestRunner()
  1336.     r.run(DocTestSuite())
  1337.  
  1338. if __name__ == '__main__':
  1339.     _test()
  1340.  
  1341.